package org.redisson;

import java.util.List;

import org.redisson.api.RLock;


/**
 * RedLock 多锁的加锁算法实现。它将所有锁作为一个来管理。
 */
    public class RedissonRedLock extends RedissonMultiLock {


    /**
     * 创建具有多个RLock对象的实例
     */
    public RedissonRedLock(RLock... locks) {
        super(locks);
    }


    /**
     * 失败锁限制
     */
    @Override
    protected int failedLocksLimit() {
        return locks.size() - minLocksAmount(locks);
    }


    /**
     * 最小锁定量
     */
    protected int minLocksAmount(final List<RLock> locks) {
        return locks.size()/2 + 1;
    }



    /**
     * 计算锁定等待时间
     */
    @Override
    protected long calcLockWaitTime(long remainTime) {
        return Math.max(remainTime / locks.size(), 1);
    }


    /**
     * 解锁
     */
    @Override
    public void unlock() {
        unlockInner(locks);
    }

}
